<?php

namespace Mogod\Core\Model\Scheme\Repository;

/**
 * Абстрактный класс репозитория схемы моделей
 *
 * @author morph, goorus
 */
abstract class ModelSchemeRepositoryAbstract
{
	/**
	 * @var string
	 */
	const FIELDS = 'fields';

	/**
	 * @var string
	 */
	const MODEL = 'model';

	/**
	 * Пустая схема моделей
	 *
	 * @var array
	 */
	protected static $emptyScheme = array(
		self::MODEL		=> array(),
		self::FIELDS	=> array()
	);

	/**
	 * Схемы моделей
	 *
	 * @var array
	 */
	protected $modelSchemes;

	/**
	 * Добавить поле в схему
	 *
	 * @param string $modelName
	 * @param string $fieldName имя поля
	 * @param array $fieldScheme схема поля
	 */
	public function appendField($modelName, $fieldName, $fieldScheme)
	{
		$this->createScheme($modelName);
		$this->modelSchemes[$modelName][self::FIELDS][$fieldName] = (array) $fieldScheme;
	}

	/**
	 * Создает пустую схему моделей
	 *
	 * @param string $modelName
	 */
	protected function createScheme($modelName)
	{
		if (empty($this->modelSchemes[$modelName])) {
			$this->modelSchemes[$modelName] = static::$emptyScheme;
		}
	}

	/**
	 * Получить значения поля модели по имени модели, полю и свойству
	 *
	 * @param string $modelName
	 * @param string $fieldName
	 * @param string $propertyName
	 * @return string
	 */
	abstract public function getFieldProperty($modelName, $fieldName,
		$propertyName);

	/**
	 * Получить значения свойства модели по имени модели и поля
	 *
	 * @param string $modelName
	 * @param string $propertyName
	 * @return string
	 */
	abstract public function getModelProperty($modelName, $propertyName);

	/**
	 * Получить схему модели
	 *
	 * @param string $modelName
	 * @return string
	 */
	public function getModelScheme($modelName)
	{
		return isset($this->modelSchemes[$modelName])
			? $this->modelSchemes[$modelName] : null;
	}

	/**
	 * Изменить схему моделей
	 *
	 * @param string $modelScheme
	 * @param array $scheme
	 */
	public function setModelScheme($modelName, $scheme)
	{
		$this->createScheme($modelName);
		$this->modelSchemes[$modelName][self::MODEL] = $scheme;
	}
}